package com.atguigu.demojuc.chap05;

import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
/*
面试：CountDownLatch 与 join 方法的区别

调用一个子线程的 join()方法后，该线程会一直被阻塞直到该线程运行完毕。
CountDownLatch 则使用计数器允许子线程运行完毕或者运行中时候递减计数，
也就是 CountDownLatch可以在子线程运行任何时候让await方法返回而不一定必须等到线程结束；
countDownLatch相比Join 方法让我们对线程同步有更灵活的控制
 */
public class CountDownLatchDemo {

    /**
     * 6个同学(子线程)陆续离开教室后值班同学（主线程）才可以关门
     */
    public static void main(String[] args) throws InterruptedException {
        //1.创建倒计数器对象
        CountDownLatch countDownLatch = new CountDownLatch(6);
        //2.循环创建6个子线程分别执行各自业务（完成课后作业）
        for (int i = 1; i <= 6; i++) {
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName()+",开始学习");
                try {
                    TimeUnit.SECONDS.sleep(new Random().nextInt(10));
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println(Thread.currentThread().getName()+",学习结束");
                countDownLatch.countDown();
            },"同学"+i).start();
        }
        //3.主线程阻塞等待各个子线程执行结束
        countDownLatch.await(10,TimeUnit.SECONDS);
        System.out.println(Thread.currentThread().getName()+"班长锁门，走人！");

    }
}